package business;

import repositorios.InterfaceRepositorioPessoa;
import repositorios.RepositorioPessoasArquivo;
import repositorios.RepositorioPessoasArray;
import repositorios.RepositorioPessoasLista;
import dados.Funcionario;
import dados.Pessoa;
import exceptions.ClienteJaCadastradoException;
import exceptions.ClienteNaoCadastradoException;
import exceptions.FuncionarioJaCadastradoException;
import exceptions.FuncionarioNaoCadastradoException;
import exceptions.ObjetoInvalidoException;

public class CadastroPessoas implements InterfaceCadastroPessoa {

	private InterfaceRepositorioPessoa repPessoasLista;
	private InterfaceRepositorioPessoa repPessoasArray;
	private InterfaceRepositorioPessoa repPessoasArquivo;

	private int rep;

	public CadastroPessoas(int rep) {
		repPessoasLista = new RepositorioPessoasLista();
		repPessoasArray = new RepositorioPessoasArray();
		repPessoasArquivo = new RepositorioPessoasArquivo();
		this.rep = rep;
	}

	@Override
	public void inserir(Pessoa p) throws ObjetoInvalidoException,
			ClienteJaCadastradoException, FuncionarioJaCadastradoException {
		if (p instanceof Funcionario) {
			if (p == null) {
				throw new ObjetoInvalidoException("Funcionario invalido.");
			}
			if (p.getCPF() == null || p.getCPF().equals("")) {
				throw new ObjetoInvalidoException("CPF invalido.");
			}
			if (p.getNome() == null || p.getNome().equals("")) {
				throw new ObjetoInvalidoException("Nome invalido.");
			}
		} else {
			if (p == null) {
				throw new ObjetoInvalidoException("Funcionario invalido.");
			}
			if (p.getCPF() == null || p.getCPF().equals("")) {
				throw new ObjetoInvalidoException("CPF invalido.");
			}
			if (p.getNome() == null || p.getNome().equals("")) {
				throw new ObjetoInvalidoException("Nome invalido.");
			}
		}

		switch (rep) {
		case 1:
			repPessoasLista.inserir(p);
			break;
		case 2:
			repPessoasArray.inserir(p);
			break;
		case 3:
			repPessoasArquivo.inserir(p);
		}
	}

	@Override
	public void remover(Pessoa p) throws FuncionarioNaoCadastradoException,
			ClienteNaoCadastradoException {
		if (rep == 1) {
			if (!repPessoasLista.verificar(p)) {
				if (p instanceof Funcionario) {
					FuncionarioNaoCadastradoException fnce = new FuncionarioNaoCadastradoException();
					throw fnce;
				} else {
					ClienteNaoCadastradoException cnce = new ClienteNaoCadastradoException();
					throw cnce;
				}
			}
			repPessoasLista.remover(p);
		}
		
		if (rep == 2) {
			if (!repPessoasArray.verificar(p)) {
				if (p instanceof Funcionario) {
					FuncionarioNaoCadastradoException fnce = new FuncionarioNaoCadastradoException();
					throw fnce;
				} else {
					ClienteNaoCadastradoException cnce = new ClienteNaoCadastradoException();
					throw cnce;
				}
			}
			repPessoasArray.remover(p);
		}
		if (rep == 3) {
			if (!repPessoasArquivo.verificar(p)) {
				if (p instanceof Funcionario) {
					FuncionarioNaoCadastradoException fnce = new FuncionarioNaoCadastradoException();
					throw fnce;
				} else {
					ClienteNaoCadastradoException cnce = new ClienteNaoCadastradoException();
					throw cnce;
				}
			}
			repPessoasArquivo.remover(p);
		}
	}

	@Override
	public Pessoa procurar(String cod) throws ClienteNaoCadastradoException,
			FuncionarioNaoCadastradoException {
		Pessoa p = null;
		if (rep == 1) {
			p = (Pessoa) repPessoasLista.procurar(cod);
		}
		if (rep == 2) {
			p = (Pessoa) repPessoasArray.procurar(cod);
		}
		if (rep == 3) {
			p = (Pessoa) repPessoasArquivo.procurar(cod);
		}
		if (p == null) {
			if (p instanceof Funcionario) {
				FuncionarioNaoCadastradoException fnce = new FuncionarioNaoCadastradoException();
				throw fnce;
			} else {
				ClienteNaoCadastradoException cnce = new ClienteNaoCadastradoException();
				throw cnce;
			}
		}
		return p;
	}

	@Override
	public void atualizar(Pessoa p) throws FuncionarioNaoCadastradoException,
			ClienteNaoCadastradoException {
		if (rep == 1) {
			if (!repPessoasLista.verificar(p)) {
				if (p instanceof Funcionario) {
					FuncionarioNaoCadastradoException fnce = new FuncionarioNaoCadastradoException();
					throw fnce;
				} else {
					ClienteNaoCadastradoException cnec = new ClienteNaoCadastradoException();
					throw cnec;
				}
			}
			repPessoasLista.atualizar(p);
		}
		if (rep == 2) {
			if (!repPessoasArray.verificar(p)) {
				if (p instanceof Funcionario) {
					FuncionarioNaoCadastradoException fnce = new FuncionarioNaoCadastradoException();
					throw fnce;
				} else {
					ClienteNaoCadastradoException cnec = new ClienteNaoCadastradoException();
					throw cnec;
				}
			}
			repPessoasArray.atualizar(p);
		}
		if (rep == 3) {
			if (!repPessoasArquivo.verificar(p)) {
				if (p instanceof Funcionario) {
					FuncionarioNaoCadastradoException fnce = new FuncionarioNaoCadastradoException();
					throw fnce;
				} else {
					ClienteNaoCadastradoException cnec = new ClienteNaoCadastradoException();
					throw cnec;
				}
			}
			repPessoasArquivo.atualizar(p);
		}
	}

}
